perm filename BATCH2.SAI[DIA,HPM] blob sn#508927 filedate 1980-05-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "BATCH2"
C00006 00003	   BEGIN "LOGIC"
C00014 00004	   BEGIN "PACKAGES"
C00016 00005	   BEGIN "BOARDS"
C00018 00006
C00019 ENDMK
C⊗;
BEGIN "BATCH2"
REQUIRE "CIRCUT.SAI[GOD,HPM]" SOURCE_FILE;
INTEGER N; BOOLEAN BENDY;
INTEGER FJ,I,J,K;
RECURSIVE INTEGER PROCEDURE BITONIC(INTEGER N; REAL X,Y);
   IF N=1 THEN RETURN(SORTER(X+2,Y)) ELSE
      BEGIN
      INTEGER M,I,B1,B2;
      INTEGER ARRAY SPL[1:M←1 ASH (N-1)];
      FOR I←1 STEP 1 UNTIL M DO SPL[I]←SORTER(X+2,Y+2*(M-I));
      B1←BITONIC(N-1,X+5,Y+M);
      B2←BITONIC(N-1,X+5,Y);
      FREEBOD←FREEBOD+2*M;
      FOR I←1 STEP 1 UNTIL M DO
	 BEGIN
	 WIRE(SPL[I]+1,B1-I);
	 WIRE(SPL[I]+2,B2-I);
	 IF BENDY THEN
	    BEGIN
	    XBOD[FREEBOD-2*I+1]←X;  YBOD[FREEBOD-2*I+1]←YBOD[SPL[I]-1];
	    XBOD[FREEBOD-2*I]←X;    YBOD[FREEBOD-2*I]←YBOD[SPL[I]-2];
	    END;
	 END;
      XBOD[FREEBOD]←X; YBOD[FREEBOD]←Y;
      FOR I←1 STEP 1 UNTIL M DO
	 BEGIN
	 IF BENDY THEN
	    BEGIN
	    WIRE(FREEBOD-I,SPL[I]-1);
	    WIRE(FREEBOD-I-M,SPL[I]-2);
	    END
	 ELSE
	    BEGIN
	    XBOD[FREEBOD-I]←XBOD[SPL[I]-1]; YBOD[FREEBOD-I]←YBOD[SPL[I]-1];
	    XBOD[FREEBOD-I-M]←XBOD[SPL[I]-2]; YBOD[FREEBOD-I-M]←YBOD[SPL[I]-2];
	    END;
	 XBOD[FREEBOD+I]  ←XBOD[B1+I];  YBOD[FREEBOD+I]  ←YBOD[B1+I];
	 XBOD[FREEBOD+I+M]←XBOD[B2+I];  YBOD[FREEBOD+I+M]←YBOD[B2+I];
	 END;
      FREEBOD←FREEBOD+2*M+1;
      RETURN(FREEBOD-2*M-1);
      END;

INTEGER PROCEDURE PACKAGE(INTEGER N; REAL XPOS,YPOS);
   BEGIN
   INTEGER NCOPY,HGT,I,J,NPIN,BT,PK; REAL XP,YP;
   LINE(XPOS,YPOS,XPOS,YPOS+17,7);
   LINE(XPOS+26,YPOS+17,XPOS,YPOS+17,7);
   LINE(XPOS+26,YPOS+17,XPOS+26,YPOS,7);
   LINE(XPOS,YPOS,XPOS+26,YPOS,7);
   PK←FREEBOD+16;
   FREEBOD←FREEBOD+33;
   FOR I←1 STEP 1 UNTIL 16 DO
      BEGIN
      LINE(XPOS-1,YPOS+16-(I-1),XPOS+.5,YPOS+16-(I-1),3);
      DOT(XPOS,YPOS+16-(I-1),11);
      LINE(XPOS+25.5,YPOS+16-(I-1),XPOS+27,YPOS+16-(I-1),3);
      DOT(XPOS+26,YPOS+16-(I-1),11);
      XBOD[PK-I]←XPOS+.5;  YBOD[PK-I]←YPOS+16-(I-1);
      XBOD[PK+I]←XPOS+25.5;  YBOD[PK+I]←YPOS+16-(I-1);
      END;
   XBOD[PK]←XPOS; YBOD[PK]←YPOS;
   NCOPY←1 ASH (4-N); HGT←1 ASH N; NPIN←1 ASH N;
   XP←(15-N*5+2)/2+.5+4+2;
   YP←(NCOPY-1)*HGT+1;
   FOR I←1 STEP 1 UNTIL NCOPY DO
       BEGIN
       BT←BITONIC(N,XP+XPOS,YP+YPOS);
       YP←YP-HGT;
       FOR J←1 STEP 1 UNTIL NPIN DO
	  BEGIN
	  WIRE(BT-J,PK-((I-1)*NPIN+J));
	  WIRE(BT+J,PK+((I-1)*NPIN+J));
	  END;
       END;

   FOR I←1 STEP 1 UNTIL 16 DO
      BEGIN
      XBOD[PK-I]←XPOS-1;
      XBOD[PK+I]←XPOS+27;
      END;

   RETURN(PK);
   END;
   BEGIN "LOGIC"
   INTEGER AGB,AEB,ALB,A,B,NA,NB,AL,BL,AGBG,AEBG,ALBG,CK,NCK,AGBL,AEBL,ALBL,
	   EL1,EL2,EL3,EL4,ELN,TP,RS,DN,CI,RI,SAH,SBH,SAL,SBL,SH,SL,
	   HL,LL,HN,LN,H,L,TPH,TPL,RSN;

   FJ←FILJOB("BATCH7.GOD[DIA,HPM]");

   FNTSELECT(2,"METMBM");
   FNTSELECT(3,"METSBM");

   DDINIT;

   SCREEN(-5,-15,35,10);

   LITEN;

   A←TMPPOINT(-2.5,8.3);
   B←TMPPOINT(-2.5,-8.3);
   CK←TIEPOINT(26,-10);
   CI←TMPPOINT(26,-12);
   RS←TMPPOINT(16,-10);
   RI←TMPPOINT(16,-12);
   H←TMPPOINT(33,3.7);
   L←TMPPOINT(33,-3.7);

   FNTPOS(XBOD[A],YBOD[A]); DEPOSIT(-5,-5,YCENTER(RIGHTIFY(JTXT(2,"A"))));
   FNTPOS(XBOD[B],YBOD[B]); DEPOSIT(-5,-5,YCENTER(RIGHTIFY(JTXT(2,"B"))));

   FNTPOS(XBOD[L],YBOD[L]); DEPOSIT(5,-5,YCENTER(LEFTIFY(JTXT(2,"H"))));
   FNTPOS(XBOD[H],YBOD[H]); DEPOSIT(5,-5,YCENTER(LEFTIFY(JTXT(2,"L"))));
   comment i changed my mind about which was high and low;

   FNTPOS(XBOD[RI],YBOD[RI]);
		   DEPOSIT(0,-5,XCENTER(TOPIFY(JTXT(2,"Reset"))));
   FNTPOS(XBOD[CI],YBOD[CI]);
		   DEPOSIT(0,-5,XCENTER(TOPIFY(JTXT(2,"Clock"))));

   NA←NOTGATED(.75,7); WIRE(A,NA-1,BELBOW);
   NB←NOTGATEU(.25,-7); WIRE(B,NB-1,BELBOW);

   AGB←NANDGATE(2,.75);
   COMMENT AEB←EQVGATE(4,0);
   ALB←NANDGATE(2,-.75);

   WIRE(A,AGB-1,1.5,BBLOB,ELBOW);
   WIRE(NB+1,AGB-2,0,BELBOW);
   WIRE(NA+1,ALB-1,0,BELBOW);
   WIRE(B,ALB-2,1.5,BBLOB,ELBOW);

   AL←LATCH(8.5,7);
   BL←LATCH(8.5,-7);
   WIRE(A,AL-1,ELBOW,0,2);
   WIRE(B,BL-2,ELBOW,0,2);
   WIRE(NA+1,AL-2,0,BELBOW);
   WIRE(NB+1,BL-1,0,BELBOW);

   AGBG←NANDGATE(5.5,3,4);
   AEBG←NANDGATE(5.5,0,4);
   ALBG←NANDGATE(5.5,-3,4);

   WIRE(A,AGBG-2,1.5,BELBOW);
   WIRE(NB+1,AGBG-3,0,ELBOW);
   WIRE(B,ALBG-3,1.5,BELBOW);
   WIRE(NA+1,ALBG-2,0,ELBOW);

   WIRE(AGB+1,AEBG-2,.5);
   COMMENT WIRE(AEB+1,AEBG-2);
   WIRE(ALB+1,AEBG-3,.5);

   NCK←NOTGATEL(10,-10);

   WIRE(CI,CK+0);
   WIRE(RI,RS+0);
   WIRE(CK,NCK-1);
   WIRE(NCK+1,BL-4,ELBOW,BLOB,2.25);
   WIRE(NCK+1,BL-3,ELBOW,BLOB,2.25);
   WIRE(NCK+1,AL-4,ELBOW,BLOB,2.25);
   WIRE(NCK+1,AL-3,ELBOW,0,2.25);
   WIRE(NCK+1,AGBG-1,ELBOW,0,BBLOB,.75);
   WIRE(NCK+1,AEBG-1,ELBOW,0,BBLOB,.75);
   WIRE(NCK+1,ALBG-1,ELBOW,0,BBLOB,.75);

   AGBL←NANDGATE(10,2,4);
   AEBL←NANDGATE(10,0,4);
   ALBL←NANDGATE(10,-2,4);

   WIRE(AGBG+1,AEBL-3,ELBOW,BLOB,1.25);
   WIRE(AGBG+1,ALBL-2,ELBOW,0,1.25);

   WIRE(AEBG+1,AGBL-2,BELBOW,0,2.25);
   WIRE(AEBG+1,ALBL-3,BELBOW,0,2.25);

   WIRE(ALBG+1,AEBL-4,ELBOW,BLOB,1.75);
   WIRE(ALBG+1,AGBL-3,ELBOW,0,1.75);

   WIRE(AGBL+1,AEBL-2,0,-1,ELBOW,BLOB,.75);
   WIRE(ALBL+1,AEBL-1,0,1,ELBOW,BLOB,.25);
   WIRE(AEBL-2,ALBL-1,-.75,ELBOW);
   WIRE(AEBL-1,AGBL-4,-.25,ELBOW);
   WIRE(AEBL+1,ALBL-4,.5,BBLOB,ELBOW,0,.7);
   WIRE(AEBL+1,AGBL-1,.5,ELBOW,0,-.7);

   EL1←NANDGATE(14+.5,-2-.3);
   EL2←NANDGATE(14+.5,0-.3);
   EL3←NANDGATE(17+.5,-2-.3,3);
   EL4←NANDGATE(17+.5,0-.3);
   WIRE(EL2+1,EL4-1,.5);
   WIRE(EL1+1,EL3-2,.5);
   WIRE(EL4+1,EL3-1,0,-.6,LOOSE,-.4,.2);
   WIRE(EL3+1,EL4-2,0,.6,LOOSE,.4,.2);
   WIRE(CK,EL1-1,BELBOW,BLOB,.25);
   WIRE(CK,EL2-2,ELBOW,0,.25);

   ELN←NOTGATED(12.5,-1.3);
   TP←TIEPOINT(12.5,0);
   WIRE(AEBL+1,TP,ELBOW); WIRE(TP,EL2-1,0,ELBOW);
   WIRE(TP,ELN-1);
   WIRE(ELN+1,EL1-2,0,ELBOW);

   RSN←NOTGATEU(XBOD[RS],-6);
   WIRE(RS,RSN-1);
   WIRE(RSN+1,EL3-3,0,ELBOW);

   WIRE(EL3+1,ALBG-4,BLOB,-2,ELBOW,BLOB,.25);
   WIRE(EL3+1,AEBG-4,0,-2,ELBOW,BLOB,.25);
   WIRE(EL3+1,AGBG-4,0,-2,ELBOW,0,.25);

   DN←NOTGATE(16,2);
   WIRE(AGBL+1,DN-1,BLOB);

   SAH←NANDGATE(22,3.7);
   SBH←NANDGATE(22,1.7);
   SH←NANDGATE(24,3.4);
   WIRE(SAH+1,SH-1,.1);
   WIRE(SBH+1,SH-2,.1);

   SAL←NANDGATE(22,-1.7);
   SBL←NANDGATE(22,-3.7);
   SL←NANDGATE(24,-3.4);
   WIRE(SAL+1,SL-1,.1);
   WIRE(SBL+1,SL-2,.1);

   WIRE(AL+1,SAH-1,BBLOB,ELBOW,BLOB,.25);
   WIRE(BL+2,SBL-2,BBLOB,ELBOW,BLOB,.75);

   WIRE(AL+1,SAL-1,ELBOW,0,.25);
   WIRE(BL+2,SBH-2,ELBOW,0,.75);

   WIRE(DN+1,SBH-1,BELBOW,0,1.25);
   WIRE(DN+1,SAL-2,BELBOW,0,1.25);
   WIRE(AGBL+1,SAH-2,3,BBLOB,ELBOW);
   WIRE(SAH-2,SBL-1,BELBOW,0,1.75);

   HL←LATCH(29,4.7);
   LL←LATCH(29,-4.7);
   HN←NOTGATEU(25,4.7);
   LN←NOTGATED(25,-4.7);

   WIRE(HN+1,HL-1,0);
   TPH←TIEPOINT(XBOD[HN-1],YBOD[HL-2]);
   WIRE(TPH,HN-1);
   WIRE(TPH,HL-2);

   WIRE(LN+1,LL-2,0);
   TPL←TIEPOINT(XBOD[LN-1],YBOD[LL-1]);
   WIRE(TPL,LN-1);
   WIRE(TPL,LL-1);

   WIRE(SL+1,TPL,ELBOW);
   WIRE(SH+1,TPH,ELBOW);

   WIRE(HL+2,H,BLOB);
   WIRE(LL+1,L,BLOB);

   WIRE(CK,LL-3,0,BELBOW);
   WIRE(CK,LL-4,0,BELBOW);
   WIRE(CK,HL-4,0,BELBOW);
   WIRE(CK,HL-3,0,ELBOW);

   DPYUP(-1); KILJOB(FJ);
   END "LOGIC";
   BEGIN "PACKAGES"
   FJ←FILJOB("BATCH8.GOD[DIA,HPM]");

   DDINIT;
   BENDY←FALSE;
   SCREEN(-10,-2,133,18);
   LITEN;

   FOR I←1 STEP 1 UNTIL 4 DO
      BEGIN
      INTEGER ARRAY BODS[0:7,1:I];
      CIRINI;
      FOR J←1 STEP 1 UNTIL I DO PACKAGE(5-I,33*(I-1),0);
      END;

   DPYUP(-1);
   KILJOB(FJ);
   END "PACKAGES";
   BEGIN "BOARDS"

   PROCEDURE TWOLAYER(INTEGER N1,N2; REAL X,Y);
      BEGIN
      INTEGER NC;
      INTEGER ARRAY D,O[0:(NC←2↑N1)-1], INP[0:16*NC-1];
      INTEGER I,J;
      FOR I←0 STEP 1 UNTIL NC-1 DO
         BEGIN
         D[I]←PACKAGE(N1,X+80,Y+(NC-1-I)*20);
         O[I]←PACKAGE(N2,X+160,Y+(NC-1-I)*20);
	 FOR J←0 STEP 1 UNTIL 15 DO
	    INP[I*16+J]←TMPPOINT(26,YBOD[D[I]-J-1]);
         END;

      FOR I←0 STEP 1 UNTIL 16*NC-1 DO
	 BEGIN
	 WIRE(D[I%16]-(I MOD 16)-1,INP[16*(I MOD NC)+I%NC]);
	 WIRE(D[I%16]+(I MOD 16)+1,O[I MOD NC]-I%NC-1);
	 END;

      END;

   FJ←FILJOB("BATCH9.GOD[DIA,HPM]");

   BENDY←FALSE;
   DDINIT;
   SCREEN(12,-23,400,60);
   CIRINI;

   TWOLAYER(1,4,0,0);

   SCREEN(-188,-3,200,80);
   CIRINI;

   TWOLAYER(2,4,0,0);
"  SCREEN(12,-3,200,160);
   CIRINI;

   TWOLAYER(3,4,0,0)";

   DPYUP(-1);
   KILJOB(FJ);
   FJ←DDJOB; GRAFIL("BATCH9.GOD[DIA,HPM]");
   CALL(0,"SNEAKW"); KILJOB(FJ);
   END "BOARDS";

END "BATCH2";